class Solution {
public:
    int *root,*v;
    int find(int x){
        if (root[x]==x) return x;
        else return root[x] = find(root[x]);
    }
    int findCircleNum(vector<vector<int>>& isConnected) {
        //统计连通分量的个数
        root = new int[isConnected.size()+1];
        v = new int[isConnected.size()+1];

        for(int i=0;i<isConnected.size();i++){
            root[i] = i;
            v[i] = 0;
        }
        // isConnected[i][j] = 1 (i!=j) 说明二者在一个分量里 合并
        for(int row = 0;row<isConnected.size();row++)
            for(int j=row+1;j<isConnected[row].size();j++)//上三角（不含对角线））
                if (isConnected[row][j]==1&&find(j)!=find(row))
                    root[find(j)] = find(row);
        int  ans = 0;
        for(int i=0;i<isConnected.size();i++)
            find(i);//刷新一遍节点，合并连通分量
        for(int i=0;i<isConnected.size();i++)
            v[root[i]] = 1;
        for(int i=0;i<isConnected.size();i++)
            ans+=v[i];   

        return ans;
    }
};